package com.xbongbong.saas.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.domain.entity.ProductCategoryEntity;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 产品分类
 * @author 吴峰
 * @version v1.0
 * @date 2019/3/22 10:08
 * @since v1.0
 */
public interface ProductCategoryModel extends IModel<ProductCategoryEntity> {

    /**
     * 插入实体
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param entity
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    @Override
    Integer insert(ProductCategoryEntity entity) throws XbbException;
    /**
     * 更新实体
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param entity
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    @Override
    Integer update(ProductCategoryEntity entity) throws XbbException;
    /**
     * 查询实体
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param param
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    @Override
    List<ProductCategoryEntity> findEntitys(Map<String, Object> param);
    /**
     * 查询实体数量
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param param
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    @Override
    Integer getEntitysCount(Map<String, Object> param);

    /**
     * 更新排序
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param list
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer updateBatch(List<ProductCategoryEntity> list, String corpid);
    /**
     * 查询实体
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param key 数据id
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    ProductCategoryEntity getByKey(Long key, String corpid);
    /**
     * 删除实体
     * @author 吴峰
     * @date 2019/3/22 10:09
     * @param key 数据id
     * @param corpid 公司id
     * @return java.lang.Integer
     */
    Integer delete(Long key, String corpid);

    /**
     * 获取产品分类信息
     * @param corpid 公司id
     * @param categoryIdIn 分类id数组
     * @return java.util.List<com.xbongbong.saas.domain.entity.ProductCategoryEntity>
     * @author zcp
     * @date 2019/4/8 21:18
     * @since v1.0
     * @version v1.0
     */
    List<ProductCategoryEntity> getProductCategoryListByIdIn(String corpid, Collection<Long> categoryIdIn);

    /**
     * 通过id列表获取产品分类并构建id和entity的对应关系
     * @param corpid 公司id
     * @param categoryIdIn 分类id数组
     * @return java.util.Map<java.lang.Long,com.xbongbong.saas.domain.entity.ProductCategoryEntity>
     * @author zcp
     * @date 2019/4/8 21:25
     * @since v1.0
     * @version v1.0
     */
    Map<Long, ProductCategoryEntity> getProductCategoryMapByIdIn(String corpid, Collection<Long> categoryIdIn);

    /**
     * 获得一个上级分类下级分类关系的Map
     * 父级和它的下一级的对应关系
     *
     * @param allCategoryList 分类列表
     * @return java.util.Map<java.lang.Long,java.util.List<com.xbongbong.saas.domain.entity.ProductCategoryEntity>>
     * @author 徐俊杰
     * @date 2019/4/8 14:01
     * @since v1.0
     */
    Map<Long, List<ProductCategoryEntity>> getSupSubListMap(List<ProductCategoryEntity> allCategoryList);

    /**
     * 可以更新为null
     * @param entity
     * @return
     * @throws XbbException
     */
    Integer updateToNull(ProductCategoryEntity entity) throws XbbException;

    Map<Long,String> categoryList(String corpid);

    /**
     * 获取某个部门下一个层级的产品分类（即父分类为选择的分类）
     * @param corpid
     * @param categoryId
     * @param containSup 是否包含父分类本身
     * @return java.util.List<com.xbongbong.saas.domain.entity.ProductCategoryEntity>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ProductCategoryEntity> getSubOneLevel(String corpid, Long categoryId, boolean containSup);
    /**
     * 从缓存获取某个部门下一个层级的产品分类（即父分类为选择的分类）
     * @param corpid
     * @param categoryId
     * @param containSup 是否包含父分类本身
     * @return java.util.List<com.xbongbong.saas.domain.entity.ProductCategoryEntity>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ProductCategoryEntity> getSubOneLevelFromJedis(String corpid, Long categoryId, boolean containSup);
}
